package com.cccccc.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Map;

/**
 * --- 代码敲对！ ---
 *
 * @author CCCccc
 * @create 2025/8/22
 * 备注：
 * 1. JWT工具类
 * 2. 生成Token、解析Token、刷新Token
 * 3. 从请求头中获取Token
 * 4. 从Token中获取用户信息
 */

@Component
public class JwtUtils {


    // 生成token
    @Value("${token.header}") // 自定义头标签
    private String header;
    @Value("${token.secret}") // 密钥
    private String secret;
    @Value("${token.expire}") // 过期时间
    private Long expire;


    /**
     * 该方法用于生成一个Token
     * 使用JWT生成器创建一个包含声明信息的Token
     * @Param  claims需要包含在Token中的声明信息，可以是一个Map对象
     * @return 返回生成的JWT字符串
     */
    public String createToken(Map<String, Object> claims) {
        // 签名算法：HS256
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        // 构造Token
        JwtBuilder builder = Jwts.builder()
                .setClaims(claims) // 设置payload中的数据(载荷)
                .signWith(signatureAlgorithm, secret) // 指定算法签名
                .setExpiration(new Date(System.currentTimeMillis() + expire * 60 * 1000)); // 设置过期时间
        return builder.compact(); // 生成token
    }


    /**
     * 该方法用于解析Token
     * 使用JWT解析器验证签名并解析出声明(Claims)信息
     * @param token 需要解析的JWT字符串
     * @return 返回包含声明信息的Claims对象
     * @throws RuntimeException 如果解析过程中出现异常，则抛出运行时异常
     */
    public Claims parseToken(String token) {
        System.out.println("token = " + token);
        try {
            // 使用JWT解析器设置签名密钥并解析token
            Claims claims = Jwts.parser()
                    .setSigningKey(secret)  // 设置用于验证签名的密钥
                    .parseClaimsJws(token).getBody(); // 解析token
            System.out.println("claims = " + claims);
            return claims;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage()); // 抛出运行时异常
        }
    }


    /**
     * 该方法用于取出Token
     * 从请求头中获取Token
     * @Param request 请求对象
     * @return 返回请求头中的Token
     */
    public String getToken(HttpServletRequest request) {
        String token = request.getHeader(header);
        // 判断token是否为空
        if(!StringUtils.isEmpty(token)) {
            return token;
        }
        return null;
    }
}

























